資料驗證是進到 controller 後第一件處理的事情,通常會用下列寫法(當然每個人coding style 很不一樣):
//查看傳入的資料格式
dd($request->input())
//資料驗證
$validated = $request->validate([
'id' => "required|int",
'name' => "required|string",
]);
//取用驗證過的資料
Group::create($validated);
上面提供一個很簡單的舉例說明相關用法。
在昨天 儲存團購資料
的功能裡面,我用到了一些資料驗證邏輯:
$validated = $request->validate([
'group_name' => 'required|string|min:3|max:50',
'organizer_id' => 'required|int',
'close_price' => 'nullable|decimal:0,2',
'close_date' => 'nullable|date|after_or_equal:today',
'allow_insert_product' => 'nullable',
'status' => 'required|int',
]);
官方文件還有很多用法,非常值得一看,在這裡擋掉可省下後面很多程式碼。
下面針對幾個驗證方式,經過其他好想工作室夥伴建議值得認識的規則:
昨天有講到,後面在新增產品資料時,我的程式邏輯會一次新增好多筆產品資料(如下圖)
資料的結構是像下圖這樣的三層結構
在驗證上, Laravel 用 .
分層,並用 *
代表萬用字符
$validated = $request->validate([
'group_id' => 'required|int',
'data' => 'required|array',
'data.*.product_name' => 'nullable|string|max:255',
// 第三層的 product_name 之驗證規則
'data.*.price' => 'nullable|required_with:data.*.product_name|int'
// 第三層的 price 之驗證規則
]);
上傳圖片也可進行驗證,
Validator::validate($input, [
'photo' => [
'required',
File::image()
->min(1024) // 檔案大小至少需 1MB
->max(12 * 1024) // 檔案大小至多 12MB
->dimensions(Rule::dimensions()->maxWidth(1000)->maxHeight(500)),
// 圖片長寬尺寸像素限制
],
另一種撰寫方式 (coding style 不同而已)
'group_image' => 'nullable|file|mimes:jpeg,png|dimensions:max_width=800,max_height=600',
Validator::make($request->all(), [
'credit_card_number' => 'required_if:payment_type,cc'
]);
若驗證規則執行失敗,會產生下列錯誤訊息:
The credit card number field is required when payment type is cc.
這裡來個舉例:團購 Group(必勝客) 對 產品 Products(芝心披薩、章魚燒披薩…) 為一對多
關係
當使用者購買 芝心披薩 ,前端傳給我這筆資料,讓我新增訂單明細資料:
{
"id": 10,
"group_id": 46,
"product_name": "芝心圈圈",
"price": "199.00",
"quantity_limit": null,
"note": null,
"created_at": "2023-09-27T08:50:48.000000Z",
"updated_at": "2023-09-27T08:50:48.000000Z",
"group": {
"id": 46,
"group_name": "拿坡里", // 原本是 必勝客
"organizer_id": 1,
"close_price": "2000.00",
"close_date": "2023-09-30",
"allow_insert_product": 1,
"status": 1,
"created_at": "2023-09-27 08:49:51",
"updated_at": "2023-09-27 08:49:51"
}
}
那訂單明細要存入 拿坡里 嗎?
根據近幾個專案開發經驗,後端還是會拿 id 進行再次驗證、取得團購資料,然後以資料庫資料為主存入訂單明細,避免前端失誤或是惡意使用者篡改資料。